Preparation

Load Packages

This code loads packages used in R and provide a path to data folder.

### install.package(pacman)
require(pacman)
p_load(ggplot2, data.table, lubridate, ggthemes, dplyr, RColorBrewer, rmarkdown, randomcoloR, 
       knitr, psych, wordcloud, kableExtra, tidyverse, flextable, scales)

### path to files 
data_path <- "/Users/evolkova/Dropbox/Projects/Govt Agenda/Data/"

Create Labels for Common Agencies

This chunk of code creates abbreviations for names of the key agencies.

mapagency <- data.table(agency = "environmental protection agency", label = "EPA") %>%
  rbind(list("department of health and human services", "DHHS")) %>%
  rbind(list("department of transportation", "Transportation")) %>%
  rbind(list("department of commerce", "Commerce")) %>%
  rbind(list("securities and exchange commission", "SEC")) %>%
  rbind(list("department of interior", "DOI")) %>%
  rbind(list("department of agriculture", "USDA")) %>%
  rbind(list("department of energy", "DOE")) %>%
  rbind(list("department of labor", "DOL")) %>%
  rbind(list("department of treasury", "Treasury")) %>%
  rbind(list("department of justice", "DOJ")) %>%
  rbind(list("nuclear regulatory commission", "NRC")) %>%
  rbind(list("federal communications commission", "FCC")) %>%
  rbind(list("department of housing and urban developm", "HUD")) %>%
  rbind(list("federal reserve system", "FRS")) %>%
  rbind(list("international trade commission", "ITC")) %>%
  rbind(list("federal energy regulatory commission", "FERC")) %>%
  rbind(list("commodity futures trading commission", "CFTC")) %>%
  rbind(list("department of veteran affairs", "DVA")) %>%
  rbind(list("consumer financial protection bureau", "CFPB")) %>%
  rbind(list("department of defense", "Defense")) %>%
  rbind(list("social security administration", "SSA"))

setkey(mapagency, agency)


mapagency %>% 
  flextable() %>% 
  autofit() %>% 
  theme_booktabs()

agency

label

commodity futures trading commission

CFTC

consumer financial protection bureau

CFPB

department of agriculture

USDA

department of commerce

Commerce

department of defense

Defense

department of energy

DOE

department of health and human services

DHHS

department of housing and urban developm

HUD

department of interior

DOI

department of justice

DOJ

department of labor

DOL

department of transportation

Transportation

department of treasury

Treasury

department of veteran affairs

DVA

environmental protection agency

EPA

federal communications commission

FCC

federal energy regulatory commission

FERC

federal reserve system

FRS

international trade commission

ITC

nuclear regulatory commission

NRC

securities and exchange commission

SEC

social security administration

SSA

Load Datasets

### this file includes top-100 words per topic
### it is a list of 100 tables 
### PROVIDED in the replication package
wordcloudlist <- "wordcloudlist.rds" %>%
  paste0(data_path, .) %>%
  readRDS()

wordcloudlist[[1]] %>% 
  head(20) %>% 
  flextable() %>% 
  autofit()

topic

term

beta

1

fee

0.109794177

1

exchang

0.033467054

1

market

0.022850266

1

order

0.021793327

1

tier

0.019684188

1

charg

0.019139130

1

pilot

0.018887929

1

propos

0.014873456

1

per

0.014854498

1

execut

0.013977665

1

rebat

0.013944487

1

will

0.013655370

1

custom

0.013271459

1

member

0.012944424

1

liquid

0.012669525

1

schedul

0.012636348

1

option

0.011816390

1

rout

0.009171673

1

particip

0.009015264

1

month

0.008792502

### this file includes labels of all 100 topics
### PROVIDED in the replication package
labels <- "topic_labels_ML_KV_JK.csv" %>%
  paste0(data_path, .) %>%
  fread(select = c("ShortLabel", "Topic"))

labels %>% 
  head(10) %>% 
  flextable() %>% 
  autofit()

ShortLabel

Topic

Penalties: Freedom of Information

1

Penalties: banks

2

Endangered Species

3

EBP

4

Securities: invt cos

5

Grants: housing & community devt

6

Env: data & studies

7

Veterans

8

Government employees

9

EP (agriculture)

10

### this is the main file
### SYNTHETIC version is included in the replication package
companyyear <- "companyyear_final.rds" %>%
  paste0(data_path, .) %>%
  readRDS() %>% 
  select("cik", "name", "year", "FF12", "regul.disp", "topic.disp", "Topic29")

companyyear %>% 
  head(10) %>% 
  flextable() %>% 
  autofit()

cik

name

year

FF12

regul.disp

topic.disp

Topic29

20

K TRON INTERNATIONAL INC

1,996

6

0.8399150

0.9274241

0.00055921461

20

K TRON INTERNATIONAL INC

1,997

6

0.8522455

0.9276763

0.00100173634

20

K TRON INTERNATIONAL INC

1,999

6

0.8283158

0.9321834

0.00006559097

20

K TRON INTERNATIONAL INC

2,001

6

0.8484812

0.9339354

0.00006591958

20

K TRON INTERNATIONAL INC

2,003

6

0.8347048

0.9406899

0.00004764173

20

K TRON INTERNATIONAL INC

2,004

6

0.8093653

0.9400247

0.00043147407

20

K TRON INTERNATIONAL INC

2,005

6

0.8144986

0.9404953

0.00734362186

20

K TRON INTERNATIONAL INC

2,006

6

0.8025276

0.9428131

0.01438246432

20

K TRON INTERNATIONAL INC

2,007

6

0.7887117

0.9455084

0.00580932147

20

K TRON INTERNATIONAL INC

2,008

6

0.8043702

0.9425870

0.00396724641

### this file shows topic distribution over agency-years
### PROVIDED in the replication package
topicagencyyear <- "topicagencyyear.csv" %>%
  paste0(data_path, .) %>%
  fread()

topicagencyyear %>% 
  head(10) %>% 
  flextable() %>% 
  autofit()

TopicNumber

agency

year

TopicWords

AllWords

AgencyPercent

1

securities and exchange commission

1,995

6,447.6060

52,772.61

0.122177134

1

department of agriculture

1,995

3,694.0364

52,772.61

0.069999126

1

environmental protection agency

1,995

4,929.8400

52,772.61

0.093416645

1

federal communications commission

1,995

3,835.1592

52,772.61

0.072673293

1

department of justice

1,995

2,713.3791

52,772.61

0.051416431

1

commodity credit corporation

1,995

100.6776

52,772.61

0.001907762

1

general services administration

1,995

185.5532

52,772.61

0.003516090

1

department of health and human services

1,995

2,890.8016

52,772.61

0.054778450

1

department of treasury

1,995

1,413.3309

52,772.61

0.026781525

1

national credit union administration

1,995

106.9971

52,772.61

0.002027512

### this file include data obtained from Federal Register
### PROVIDED in the replication package
fedreg <- "fedreg_with_words.csv" %>%
  paste0(data_path, .) %>%
  fread()

fedreg %>% 
  head(10) %>% 
  flextable() %>% 
  autofit()

document_number

type

date

year

agency

Nagencies

nwords

94-32388

Presidential Document

1995-01-03

1,995

executive office of the president

1

174

94-32287

Rule

1995-01-03

1,995

department of agriculture

1

366

94-32288

Rule

1995-01-03

1,995

department of agriculture

1

288

94-32036

Rule

1995-01-03

1,995

department of transportation

1

351

94-32250

Rule

1995-01-03

1,995

securities and exchange commission

1

239

94-32126

Rule

1995-01-03

1,995

international trade commission

1

2,679

94-32127

Rule

1995-01-03

1,995

international trade commission

1

1,334

94-32331

Rule

1995-01-03

1,995

department of treasury

1

2,237

94-31665

Rule

1995-01-03

1,995

department of treasury

1

1,041

94-32197

Rule

1995-01-03

1,995

department of justice

1

120

### this file include results of placebo test
### PROVIDED in the replication package
### Code for random simulations is also provided

firm_placebo <- "firm_placebo.csv" %>% 
  paste0(data_path,.) %>% 
  fread

firm_placebo %>% 
  head(10) %>% 
  flextable() %>% 
  autofit()

Estimate

Std. Error

t value

Pr(>|t|)

variable

yvar

iter

0.055692551

0.014080436

3.9553144

0.000256366381497640991299

regul.disp_norm

lead.sga_at_norm

0

0.033443098

0.025282297

1.3227872

0.192306446873755004789430

regul.complex.log_norm

lead.sga_at_norm

0

0.045634481

0.018924892

2.4113469

0.019854553478668199306689

topic.disp_norm

lead.sga_at_norm

0

-0.014225601

0.011128463

-1.2783078

0.207417814681061019044250

LogWords10K_norm

lead.sga_at_norm

0

0.068140415

0.030279498

2.2503812

0.029144311243643600956021

ppe_at_norm

lead.sga_at_norm

0

-0.023155087

0.009721726

-2.3817876

0.021329156235213701103826

ebitda_at_norm

lead.sga_at_norm

0

-0.317033602

0.049643457

-6.3862112

0.000000069891455211498988

log_sale_norm

lead.sga_at_norm

0

0.110807761

0.008201900

13.5100115

0.000000000000000008434914

tobin_norm

lead.sga_at_norm

0

-0.030862211

0.017811584

-1.7327045

0.090315831480421007726456

regul.disp_norm

lead.tfp_norm

0

0.006716982

0.020473255

0.3280857

0.744439126311973065064365

regul.complex.log_norm

lead.tfp_norm

0

Figure 1: Total number of words in the Federal Register

data <- fedreg[year %in% 1995:2019 & type %in% c("Notice", "Proposed Rule", "Rule"), list(Words = sum(nwords)), by = c("year,type")]

library(ggplot2)

plot <- ggplot(data, aes(x = year, y = Words, col = type)) + 
  geom_line() +
  ylab("Words in Federal Register") + 
  theme_minimal() + 
  theme(axis.title.x = element_blank()) +
  scale_color_brewer(palette = "Paired") +
  scale_y_continuous(labels = comma,limits = c(0, 8*10^6)) + 
  guides(color = guide_legend(title = "Document Type", ncol = 3)) + 
  theme(legend.position='bottom') 

      
print(plot)

Figure 2: Topic clouds

make_cloud <- function(i) {
  wordcloud(wordcloudlist[[i]]$term, wordcloudlist[[i]]$beta, colors = brewer.pal(8, "Dark2"), random.order = F) %>%
    print()
}
make_cloud(3)

## NULL
make_cloud(5)

## NULL
make_cloud(21)

## NULL
make_cloud(23)

## NULL

Figure 3: Regulatory fragmentation histograms

Panel A: Fragmentation of topics across agencies

data <- topicagencyyear[, list(disp = 1 - sum(AgencyPercent^2)), by = c("year,TopicNumber")]

p <- ggplot(data = data, aes(disp)) +
  geom_histogram(aes(y = 0.01 * ..density..), fill = "darkgreen", binwidth = 0.01, color = "black") +
  theme_minimal() +
  xlab("Dispersion of Topics Across Agencies") +
  ylab("Density [% of topic-year obs]")

print(p)

Panel B: Dispersion of topics within each firm-year

p <- ggplot(data = companyyear, aes(topic.disp)) +
  geom_histogram(aes(y=0.0025*..density..),fill="steelblue", col = "darkblue", bins = 30) + 
  theme_minimal() + xlab("Dispersion of Topics Within Each Firm-Year") + 
  ylab("Density [% of Firm-Year Obs]")

print(p)

Panel C: Regulatory fragmentation at the firm-year level

p <- ggplot(data = companyyear, aes(regul.disp)) +
  geom_histogram(aes(y = 0.005 * ..density..), fill = "purple", binwidth = 0.005, color = "purple4") +
  theme_minimal() +
  xlab("Regulatory Fragmentation") +
  ylab("Density [% of firm-year obs]")
print(p)

Figure 5: Changes in Regulatory Fragmentation around Trump Election and the Global Financial Crisis

Panel A: Topics with the biggest change in fragmentation around the 2016 presidential election

difgraph <- function(int1, int2, lab1, lab2) {
  
  ### generate agency dispersion file 
  agencydisp <- topicagencyyear[, list(AgencyDisp = 1 - sum(AgencyPercent^2)), by = "TopicNumber,year"]
  
  ### measure interval1 and interval2 dispersions by topic
  increases <- agencydisp[, list(
    regul1 = mean(AgencyDisp[year %in% int1]), 
    regul2 = mean(AgencyDisp[year %in% int2])), by = TopicNumber]

  ### estimate change between interval2 and interval1
  increases[, change := regul2 - regul1]
  
  ### order observations by change
  setkey(increases, change)
  
  ### add labels to data.table with increases
  for(tp in as.numeric(1:100)) increases[TopicNumber == tp, label1 := labels$ShortLabel[match(tp, labels$Topic)]]
  
  ### add topicnumber to the start of the label 
  increases[, label1 := paste0(TopicNumber, ".", label1)]
  
  ### rank all observations (they are ordered by change)
  increases[, rank := 1:.N]
  
  ### split label into several lines, 15 characters each
  increases[, label1 := paste0(strsplit(as.character(label1), "(?<=.{15})", perl = TRUE)[[1]], collapse = "\n"), 
            by = rank]

  ### look at top and bottom 3 topics by change
  increases <- increases[rank %in% c(1:3, 98:100)]
  
  ### set layers (they will determine the order)
  layers <- increases$label[c(6:4, 1:3)]
  
  ### set rank as data.table key
  setkey(increases, rank)
  
  ### select variables and melt into longer data.table (for ggplot2)
  increases <- increases %>%
    select("TopicNumber", "label1", "regul1", "regul2", "rank") %>%
    melt(id.vars = c("TopicNumber", "label1", "rank"))

  ### rename columns
  colnames(increases) <- c("topic", "label", "rank", "year", "reguldisp")

  ### divide between increases and decreases 
  increases[rank %in% 1:3, type := "2. Decrease"]
  increases[rank %in% 98:100, type := "1. Increase"]
  
  ### put labels to word count before/after
  increases[year == "regul1", year := lab1]
  increases[year == "regul2", year := lab2]

  ### add layers (determine the order)
  increases$label <- factor(increases$label, levels = layers)

  ### plot graph set up
  plot <- increases %>%
    ggplot(aes(x = label, y = reguldisp, fill = year)) +
    geom_bar(stat = "identity", position = "dodge") +
    facet_wrap(~type, scales = "free_x") +
    theme_minimal() +
    theme(legend.position='bottom', text=element_text(family="Georgia"),
          legend.title = element_text(size = rel(0.75)), 
          legend.text = element_text(size = rel(0.75)),
          axis.title.x = element_blank()) +
    guides(fill = guide_legend(title = "Period")) +
    scale_fill_brewer(palette = "Paired") +
    ylab("Dispersion Across Agencies")

  return(plot)
}

difgraph(2014:2016, 2017:2019, "2014-2016", "2017-2019") %>% print()

Panel B: Topics with the biggest change in fragmentation around the 2008-09 financial crisis

difgraph(2006:2008, 2009:2011, "2006-2008","2009-2011") %>% print

Figure 6: A case study

Panel A: # words written on ‘banks’ topic each year, by the top 10 agencies

top_agencies <- function(years, TP) {
  ### set colors
  my_palette <- c(
    "#E74C3C", "#3498DB", "#2ECC71", "#9B59B6", "#F1C40F",
    "#E67E22", "#1ABC9C", "#000000", "#C0392B", "#2980B9",
    "#ade5e5", "#8E44AD"
  )

  ### sort data
  sorted_data <- topicagencyyear[order(-topicagencyyear$AgencyPercent), ]

  ### select top-10 agencies based on sorting
  top_10_agencies <- sorted_data[year == min(years) & TopicNumber == TP, agency][1:10]

  ### select years and topic from topicagencyyear table
  data <- topicagencyyear[year %in% years & TopicNumber == TP]

  ### create shorter names for agencies using mapagency table
  data$Agency <- mapagency$label[match(data$agency, mapagency$agency)]

  ### some agency names are short and we can use them as labels
  data[is.na(Agency), Agency := agency]

  ### limit sample to top10 agencies
  data <- data[agency %in% top_10_agencies]

  ### this is the way how we can set an order to the legend in ggplot2
  data$Agency <- factor(data$Agency, levels = unique(data[match(top_10_agencies, data$agency), ]$Agency))


  ### plot the graph
  pl <- ggplot(data, aes(x = Agency, y = TopicWords, fill = Agency)) +
    geom_bar(stat = "identity") +
    facet_wrap(~year) +
    scale_fill_manual(values = my_palette) +
    scale_y_continuous(labels = comma) +
    ylab("Words written by an agency on selected topic") +
    theme(
      axis.text.x = element_blank(),
      axis.ticks.x = element_blank(),
      legend.position = "bottom",
      axis.line = element_line(size = rel(1), colour = "black"),
      panel.grid.major = element_line(colour = "#d3d3d3"),
      panel.grid.minor = element_blank(),
      panel.border = element_blank(),
      panel.background = element_blank(),
      plot.title = element_text(size = rel(1.5), face = "bold", hjust = 0.5),
      axis.title.y = element_text(colour = "black", size = rel(1.2)),
      axis.text.y = element_text(colour = "black", size = rel(1.2))
    )
  return(pl)
}

top_agencies(2014:2019, 29)

Panel B: Regulatory fragmentation each year, of 12 firms with highest weight on ‘banks’ topic

plot_top_companies <- function(years, TP, shockyr) {
  my_palette <- c(
    "#E74C3C", "#3498DB", "#2ECC71", "#9B59B6", "#F1C40F",
    "#E67E22", "#1ABC9C", "#000000", "#C0392B", "#2980B9",
    "#ade5e5", "#8E44AD", "#ade5e5", "#8E44AD"
  )

  ### select years and variables from the main file
  data <- companyyear[year %in% years] %>% select("cik", "year", "name", TP, "regul.disp")

  ### order data
  setkey(data, cik, year)

  ### count number of observations per CIK
  data[, n1 := .N, by = cik]

  ### drop companies with less than 5 obs (IPOs or exits)
  data <- data[n1 > 5]

  ### shorter the name of the company, make it robust to the name change
  data[, name := substr((name[1]), 1, 35), by = cik]

  ### set order by the frequency of selected topic
  data <- data[order(data[[4]], decreasing = T)]

  ### number companies by the frequency of the key topic per year
  data[, n2 := 1:.N, by = "year"]

  ### order by company and year
  setkey(data, name, year)

  ### fix order of the companies at the start of the sample
  ### (i.e. company #1 is company with higher weight on TP topic)
  data[, n3 := n2[1], by = name]

  ### keep top12 companies (based on the topic frequency in the first year)
  data <- data[n3 %in% 1:12]

  ### this is the way company names will be ordered in the legend
  data$name <- factor(data$name, levels = unique(data[order(n3)]$name))

  ### plot the graph
  pl <- data %>%
    ggplot(aes(x = year, y = regul.disp, group = name, col = name, fill = name)) +
    geom_line(alpha = 0.7, size = 1.5) +
    theme(legend.position = "bottom") +
    theme(
      axis.line = element_line(size = rel(1), colour = "black"),
      panel.grid.major = element_line(colour = "#d3d3d3"),
      panel.grid.minor = element_blank(),
      panel.border = element_blank(), panel.background = element_blank(),
      plot.title = element_text(size = rel(1.5), face = "bold"),
      axis.text.x = element_text(colour = "black", size = rel(1.0)),
      axis.title.x = element_text(colour = "black", size = rel(1)),
      legend.title = element_blank(),
      legend.text = element_text(size = rel(0.6)),
      axis.title.y = element_text(colour = "black", size = rel(1.2))
    ) +
    theme(plot.title = element_text(hjust = 0.5)) +
    xlab("Year") +
    ylab("Regulatory Fragmentation") +
    scale_color_manual(values = my_palette, name = "Company Name") +
    ylim(0.70, 0.85) +
    guides(col = guide_legend(title.position = "left", label.position = "right", ncol = 5)) +
    geom_vline(xintercept = shockyr, linetype = "dashed", color = "red")
  return(pl)
}

plot_top_companies(2014:2019, "Topic29", 2016) %>% print()

Figure 7: Placebo test to address endogeneity concerns

Panel A: Dept var = SG&A / assets

yvars <- c("lead.sga_at", "lead.tfp", "lead.roa", "lead.growth", "lead.growth.at", "lead.emp_at") %>% paste0("_norm")

### we plot histogram of t-statistics
### iteration zero = actual results (red line)
### other iterations = placebo (light blue bars)
pl <- function(y, fl = "lightblue"){
  data <- firm_placebo[yvar == y & variable == "regul.disp_norm"]
  
  ggplot(data = data[iter > 0]) + 
  geom_histogram(aes(`t value`), bins = 50, color="#000099", fill= fl) +
  theme_minimal() + xlab("T-statistics") + ylab("Count") + 
  geom_vline(xintercept = data[iter == 0]$`t value`, col = "red")
  
}

pl(yvars[1])

Panel B: Dept var = TFP

pl(yvars[2])

Panel C: Dept var = ROA

pl(yvars[3])

Panel D: Dept var = Sales growth

pl(yvars[4])

Panel E: Dept var = Assets growth

pl(yvars[5])

Panel F: Dept var = Employment

pl(yvars[6])

Session Info

sessionInfo()
## R version 4.2.2 (2022-10-31)
## Platform: aarch64-apple-darwin20 (64-bit)
## Running under: macOS 14.0
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.2-arm64/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.2-arm64/Resources/lib/libRlapack.dylib
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] scales_1.2.1        flextable_0.9.0     forcats_1.0.0      
##  [4] stringr_1.5.0       purrr_1.0.1         readr_2.1.4        
##  [7] tidyr_1.3.0         tibble_3.1.8        tidyverse_2.0.0    
## [10] kableExtra_1.3.4    wordcloud_2.6       psych_2.3.3        
## [13] knitr_1.42          randomcoloR_1.1.0.1 rmarkdown_2.20     
## [16] RColorBrewer_1.1-3  dplyr_1.1.0         ggthemes_4.2.4     
## [19] lubridate_1.9.2     data.table_1.14.8   ggplot2_3.4.1      
## [22] pacman_0.5.1       
## 
## loaded via a namespace (and not attached):
##  [1] nlme_3.1-160            fontquiver_0.2.1        webshot_0.5.4          
##  [4] httr_1.4.7              tools_4.2.2             bslib_0.4.2            
##  [7] utf8_1.2.3              R6_2.5.1                colorspace_2.1-0       
## [10] withr_2.5.0             tidyselect_1.2.0        mnormt_2.1.1           
## [13] curl_5.0.2              compiler_4.2.2          textshaping_0.3.6      
## [16] cli_3.6.0               rvest_1.0.3             xml2_1.3.3             
## [19] officer_0.6.1           fontBitstreamVera_0.1.1 labeling_0.4.2         
## [22] triebeard_0.4.1         sass_0.4.5              askpass_1.1            
## [25] systemfonts_1.0.4       digest_0.6.31           svglite_2.1.1          
## [28] gfonts_0.2.0            pkgconfig_2.0.3         htmltools_0.5.4        
## [31] highr_0.10              fastmap_1.1.1           rlang_1.0.6            
## [34] rstudioapi_0.14         httpcode_0.3.0          shiny_1.7.4            
## [37] farver_2.1.1            jquerylib_0.1.4         generics_0.1.3         
## [40] jsonlite_1.8.7          zip_2.2.2               magrittr_2.0.3         
## [43] Rcpp_1.0.10             munsell_0.5.0           fansi_1.0.4            
## [46] gdtools_0.3.2           lifecycle_1.0.3         stringi_1.7.12         
## [49] yaml_2.3.7              Rtsne_0.16              grid_4.2.2             
## [52] parallel_4.2.2          promises_1.2.0.1        crayon_1.5.2           
## [55] lattice_0.20-45         hms_1.1.2               pillar_1.8.1           
## [58] uuid_1.1-0              crul_1.3                glue_1.6.2             
## [61] evaluate_0.20           V8_4.2.2                fontLiberation_0.1.0   
## [64] urltools_1.7.3          vctrs_0.5.2             tzdb_0.3.0             
## [67] httpuv_1.6.9            openssl_2.0.5           gtable_0.3.1           
## [70] cachem_1.0.7            xfun_0.37               mime_0.12              
## [73] xtable_1.8-4            later_1.3.0             ragg_1.2.5             
## [76] viridisLite_0.4.1       memoise_2.0.1           cluster_2.1.4          
## [79] timechange_0.2.0        ellipsis_0.3.2